package com.hhck.controller;

import com.hhck.constants.Constants;
import com.hhck.dto.AssignRoleDto;
import com.hhck.entity.*;
import com.hhck.service.AuthService;
import com.hhck.service.UserService;
import com.hhck.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private AuthService authService;

    @Autowired
    private TokenUtils tokenUtils;

    @Autowired
    private UserService userService;

    /**
     * 加载用户权限菜单树
     */
    @GetMapping("/auth-list")
    public Result authList(@RequestHeader(Constants.HEADER_TOKEN_NAME) String token){

        // 通过请求头中的token获取当前用户
        CurrentUser currentUser = tokenUtils.getCurrentUser(token);
        // 通过用户id获取用户菜单树
        List<Auth> authTree = authService.queryAuthTreeByUserId(currentUser.getUserId());

        return Result.ok(authTree);
    }

    /**
     * 获取用户列表
     */
    @GetMapping("/user-list")
    public Result userList(Page page, User user) {
        return Result.ok(userService.queryUserByPage(page, user));
    }

    /**
     * 添加用户
     */
    @PostMapping("/addUser")
    public Result addUser(@RequestBody User user, @RequestHeader(Constants.HEADER_TOKEN_NAME) String token) {

        // 获取当前登录用户
        CurrentUser currentUser = tokenUtils.getCurrentUser(token);
        // 设置创建者（当前用户就是创建者）
        user.setCreateBy(currentUser.getUserId());

        return userService.saveUser(user);
    }

    /**
     * 根据用户id更改用户状态（启用或禁用不属于修改，不需要更新修改者和修改时间）
     */
    @PutMapping("/updateState")
    public Result updateState(@RequestBody User user) {
        return userService.modifyUserStateByUserId(user);
    }

    /**
     * 根据用户id查询用户已分配的角色
     */
    @GetMapping("/user-role-list/{userId}")
    public Result userRoleList(@PathVariable Integer userId) {
        return Result.ok(userService.queryUserRoleByUserId(userId));
    }

    /**
     * 给用户分配角色
     *  1、根据要分配的角色名称查询角色id
     *  2、删除用户的所有角色
     *  3、使用查询出的角色id给用户分配角色
     */
    @RequestMapping("/assignRole")
    public Result assignRole(@RequestBody AssignRoleDto assignRoleDto) {

        try {
            // 发生异常事务自动回滚
            userService.saveUserRoleByUserId(assignRoleDto);
            return Result.ok("分配成功！");
        } catch (Exception e) {
            return Result.err(Result.CODE_ERR_BUSINESS, "分配失败！");
        }
    }

    /**
     * 根据用户id删除用户（逻辑删除）
     */
    @DeleteMapping("/deleteUser/{userId}")
    public Result deleteUser(@PathVariable("userId") Integer userId) {

        try {
            // 发生异常事务自动回滚
            userService.removeUserByUserId(userId);
            return Result.ok("删除成功！");
        } catch (Exception e) {
            return Result.err(Result.CODE_ERR_BUSINESS, "删除失败！");
        }
    }

    /**
     * 批量删除用户（逻辑删除）
     */
    @DeleteMapping("/deleteUserList")
    public Result deleteUserList(@RequestBody List<Integer> userIdList) {

        try {
            // 发生异常事务自动回滚
            userService.batchRemoveUser(userIdList);
            return Result.ok("删除成功！");
        } catch (Exception e) {
            return Result.err(Result.CODE_ERR_BUSINESS, "删除失败！");
        }
    }

    /**
     * 根据用户id修改用户昵称（注意更新修改者和修改时间）
     */
    @PutMapping("/updateUser")
    public Result updateUser(@RequestBody User user, @RequestHeader(Constants.HEADER_TOKEN_NAME) String token) {

        // 通过token获取当前用户（修改者）
        CurrentUser currentUser = tokenUtils.getCurrentUser(token);
        // 更新修改者
        user.setUpdateBy(currentUser.getUserId());

        return userService.modifyUserNameByUserId(user);
    }

    /**
     * 根据用户id重置密码
     */
    @PutMapping("/updatePwd/{userId}")
    public Result updatePwd(@PathVariable("userId") Integer userId) {
        return userService.modifyUserPwdByUserId(userId);
    }

    /**
     * 根据用户id查询权限id
     */
    @GetMapping("/user-auth")
    public Result userAuth(Integer userId) {
        return Result.ok(userService.queryUserAuthIdListByUserId(userId));
    }

}

